package org.smart4j.framework.helper;

import java.lang.annotation.Annotation;
import java.util.HashSet;
import java.util.Set;

import org.smart4j.framework.annotation.Controller;
import org.smart4j.framework.annotation.Service;
import org.smart4j.framework.util.ClassUtil;

/**
 * description: 类操作助手类
 * @version v1.0
 * @author w
 * @date 2018年8月28日下午9:56:48
 *
 */
public final class ClassHelper {
	@SuppressWarnings("unused")
	private ClassHelper helper = new ClassHelper();
	
	private static final Set<Class<?>> CLASS_SET ;
	
	static{
		String basePackage = ConfigHelper.getAppBasePackage();
		CLASS_SET = ClassUtil.getClassSet(basePackage);
	}
	
	/**
	 * description: 获取应用包名下所有类 
	 * @return
	 * Set<Class<?>>
	 * @version v1.0
	 * @author w
	 * @date 2018年8月28日 下午10:03:53
	 */
	public static Set<Class<?>> getClassSet(){
		return CLASS_SET;
	}
	
	/**
	 * description: 获取应用包名下 所有 service 类
	 * @return
	 * Set<Class<?>>
	 * @version v1.0
	 * @author w
	 * @date 2018年8月28日 下午10:12:07
	 */
	public static Set<Class<?>> getServiceClassSet(){
		Set<Class<?>> serviceSet = new HashSet<Class<?>>();
		for (Class<?> clzz : CLASS_SET) {
			if(clzz.isAnnotationPresent(Service.class)){
				serviceSet.add(clzz);
			}
		}
		return serviceSet;
	}
	
	/**
	 * description: 获取应用包名下所有 Controller 类
	 * @return
	 * Set<Class<?>>
	 * @version v1.0
	 * @author w
	 * @date 2018年8月28日 下午10:13:42
	 */
	public static Set<Class<?>> getControllerClassSet(){
		Set<Class<?>> controllerSet = new HashSet<Class<?>>();
		for (Class<?> clzz : CLASS_SET) {
			if(clzz.isAnnotationPresent(Controller.class)){
				controllerSet.add(clzz);
			}
		}
		return controllerSet;
	}
	
	/**
	 * description: 获取包名下所有 bean 类。 （ Controller类和 Service 类）
	 * @return
	 * Set<Class<?>>
	 * @version v1.0
	 * @author w
	 * @date 2018年8月28日 下午10:15:48
	 *
	 */
	public static Set<Class<?>> getBeanClassSet(){
		Set<Class<?>> beanClassSet = new HashSet<Class<?>>();
		beanClassSet.addAll(getServiceClassSet());
		beanClassSet.addAll(getControllerClassSet());
		return beanClassSet;
	}
	
	/**
	 * description: 获取 类（或接口）下的所有子类（或者实现类）集合
	 * @param superClass
	 * @return
	 * Set<Class<?>> 
	 * @version v1.0
	 * @author w
	 * @date 2018年9月27日 下午5:37:41
	 */
	public static Set<Class<?>> getClassSetBySuper(Class<?> superClass){
		Set<Class<?>> classSet = new HashSet<Class<?>>();
		for (Class<?> cls : CLASS_SET) {
			if(superClass.isAssignableFrom(cls) && !cls.equals(superClass)){
				classSet.add(cls);
			}
		}
		return classSet;
	}
	
	
	/**
	 * description: 获取类下，包含有某个注解类的 集合
	 * @param annotationClass
	 * @return
	 * Set<Class<?>> 
	 * @version v1.0
	 * @author w
	 * @date 2018年9月27日 下午5:55:26
	 */
	public static Set<Class<?>> getClassSetByAnnotation(Class<? extends Annotation> annotationClass){
		Set<Class<?>> classSet = new HashSet<Class<?>>();
		for (Class<?> cls : CLASS_SET) {
			if(cls.isAnnotationPresent(annotationClass)){
				classSet.add(cls);
			}
		}
		return classSet;
	}
	
}
